package com.itheima.d0_feedback;

import java.util.Arrays;
import java.util.Comparator;

/*
老师请说一下
1、Arrays.sort(students, new ComparatorStudent>() 和TreeSet<Student> students1=new TreeSet<> (new Comparator<Student>()  两者比较的区别
区别：一个是对数组进行排序，一个是对Set集合进行排序。
相同：比较器的使用一模一样。

Arrays.sort()
Collections.sort
TreeSet

2、equals方法重写的时候为什么一定要重写hashCode方法 能再说一说吗？
    hashCode 在Object中的逻辑获取的哈希值是由对象的地址去生成的。
    在没有重写前，两个同类型，同属性值的对象其获取的哈希值大概率是不一样。
    在重写后，哈希值的获取是根据对象的属性内容值去获取的，如果两个对象的属性值是一样，意味着获取的哈希值就一样，一定会碰撞在一起。


3、list集合有索引而set集合无所引，那list集合的索引是依据什么实现的？
List(接口，设计的规范就是携带索引，具体是由子类去实现)
    ArrayList： 底层是数组实现的。集合的索引，对应了数组的索引使用。
    LinkedList：底层是由链表结构实现的。按照顺序从0来时逐渐递增到size-1

4、老师能讲一下这句源码吗
通过获取的原始哈希值，再次哈希运算得到的新的哈希值。
HashMap<K,V>
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 追源码的时候看不懂  >>>  这个符号

 */

class Demo2 {
    public static void main(String[] args) {
        int h1 = 0b11111111111111110000000000000000;
        //int h2 = h1 >>> 16;
        int h2 = 0b00000000000000001111111111111111;
        int h = h1 ^ h2;
        System.out.println("h1 = " + Integer.toBinaryString(h1));//整数的二进制形式
        System.out.println("h2 = " + Integer.toBinaryString(h2));//整数的二进制形式
        System.out.println("Integer.toBinaryString(h) = " + Integer.toBinaryString(h));
    }
}


public class Demo {
    public static void main(String[] args) {
        String[] arr = {"A", "C", "B", "D"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));//[A, B, C, D]
        //我想要降序排序
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });
        System.out.println(Arrays.toString(arr));//[A, B, C, D]

        System.out.println("========");
        Zi[] zis = new Zi[4];
        zis[0] = new Zi("A", 3);
        zis[1] = new Zi("B", 2);
        zis[2] = new Zi("C", 1);
        zis[3] = new Zi("D", 0);
        System.out.println(Arrays.toString(zis));
        Arrays.sort(zis);
        System.out.println(Arrays.toString(zis));

    }
}


class Zi implements Comparable<Zi> {
    String zimu;
    int size;

    public Zi(String zimu, int size) {
        this.zimu = zimu;
        this.size = size;
    }

    @Override
    public String toString() {
        return zimu;
    }

    @Override
    public int compareTo(Zi o) {
        return Integer.compare(this.size, o.size);
    }
}